package com.cong.modules.sys.controller;

import com.cong.common.constant.CoreConst;
import com.cong.common.util.UUIDUtil;
import com.cong.common.vo.AjaxResultVo;
import com.cong.modules.base.BaseController;
import com.cong.modules.sys.model.SysMenu;
import com.cong.modules.sys.service.MenuService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/menu")
public class MenuController extends BaseController {

	/**
	 *  1:全部资源，2：菜单资源
	 */
	private static final String[] MENU_FLAG = { "1", "2" };

	@Resource
	private MenuService menuService;

	/**
	 * 权限管理--菜单管理
	 */
	@GetMapping("/toMenuPage")
	public String menuList() {
		return "menu/list";
	}

	/**
	 * 系统工具--菜单管理选择图标
	 */
	@GetMapping(value = "/toicon")
	public String toicon() {
		return "menu/icon";
	}

	/**
	 * 菜单列表数据
	 *
	 * @param flag 标识 1:全部资源，2：菜单资源
	 * @return 返回菜单列表数据
	 */
	@RequiresPermissions("menu:list")
	@PostMapping("/list")
	@ResponseBody
	public List<SysMenu> loadMenus(String flag) {
		List<SysMenu> menuList = new ArrayList<>();
		if (StringUtils.isBlank(flag) || MENU_FLAG[0].equals(flag)) {
			menuList = menuService.listAllPermsByStatus(CoreConst.STATUS_VALID);
		} else if (MENU_FLAG[1].equals(flag)) {
			menuList = menuService.listAllMenuName(CoreConst.STATUS_VALID);
			for (SysMenu sysMenu : menuList) {
				sysMenu.setUrl(null);
			}
		}
		return menuList;
	}

	/**
	 * 跳转菜单添加
	 *
	 * @param model 跳转实体
	 * @param menuId 菜单ID
	 * @return 返回添加菜单数据
	 */
	@RequiresPermissions("menu:add")
	@GetMapping("/add")
	public String add(Model model, String menuId) {
		SysMenu menu = new SysMenu();
		Integer checkedType = 0;
		if ("0".equals(menuId)) {
			menu.setName("顶层菜单");
			menu.setMenuId(0L);
			menu.setType(0);
		} else {
			menu = menuService.getSysMenuByMenuId(Long.valueOf(menuId));
			Integer type = menu.getType();
			checkedType = type;
			if (type.equals(0)) {
				menu.setType(1);
			}
			if (type.equals(1)) {
				menu.setType(2);
			}
		}
		model.addAttribute("checkedType", checkedType);
		model.addAttribute("menu", menu);
		return "menu/add";
	}

	/**
	 * 添加菜单
	 *
	 * @param menu 添加菜单数据
	 * @return 返回菜单添加结果
	 */
	@RequiresPermissions("menu:add")
	@PostMapping("/doAdd")
	@ResponseBody
	public AjaxResultVo addMenu(SysMenu menu) {
		try {
			Date date = new Date();
			if (StringUtils.isEmpty(menu.getUrl())) {
				menu.setUrl("#");
			}
			menu.setMenuId(Long.valueOf(UUIDUtil.getUniqueIdByUUId()));
			menu.setStatus(CoreConst.STATUS_VALID);
			menu.setCreateTime(date);
			menu.setUpdateTime(date);
			if (menuService.save(menu)) {
				return AjaxResultVo.success("添加菜单成功");
			} else {
				return AjaxResultVo.error("添加菜单失败");
			}
		} catch (Exception e) {
			logger.error(String.format("菜单添加异常 MenuController.addMenu%s", e));
			return AjaxResultVo.error("添加失败");
		}
	}

	/**
	 * 删除菜单
	 *
	 * @param menuId 菜单ID
	 * @return 返回菜单删除结果
	 */
	@RequiresPermissions("menu:delete")
	@PostMapping("/delete")
	@ResponseBody
	public AjaxResultVo deleteMenu(String menuId) {
		try {
			int subPermsCount = menuService.countMenuByParentId(Long.valueOf(menuId));
			if (subPermsCount > 0) {
				return AjaxResultVo.error("存在子菜单,不允许删除");
			}
			int menuAuthedCount = menuService.countRoleMenuByMenuId(Long.valueOf(menuId));
			if (menuAuthedCount > 0) {
				return AjaxResultVo.error("菜单已分配,不允许删除");
			}
			int deleteResult = menuService.deleteMenuByMenuId(Long.valueOf(menuId));
			if (deleteResult > 0) {
				return AjaxResultVo.success("删除菜单成功");
			} else {
				return AjaxResultVo.error("删除菜单失败");
			}
		} catch (Exception e) {
			logger.error(String.format("菜单删除异常 MenuController.deleteMenu%s", e));
			return AjaxResultVo.error("删除失败");
		}
	}

	/**
	 * 菜单详情
	 *
	 * @param model 页面跳转实体
	 * @param menuId 菜单ID
	 * @return 返回菜单详情
	 */
	@RequiresPermissions("menu:edit")
	@GetMapping("/edit")
	public String detail(Model model, String menuId) {
		SysMenu menu = menuService.getSysMenuByMenuId(Long.valueOf(menuId));
		if (null != menu) {
			if (menu.getParentId().equals(CoreConst.TOP_MENU_ID)) {
				model.addAttribute("parentName", CoreConst.TOP_MENU_NAME);
				model.addAttribute("checkType", 0);
			} else {
				SysMenu parent = menuService.getSysMenuByMenuId(menu.getParentId());
				model.addAttribute("parentName", parent.getName());
				model.addAttribute("checkType", parent.getType());
			}
		}
		model.addAttribute("menu", menu);
		return "menu/detail";
	}

	/**
	 * 编辑菜单
	 *
	 * @param menu 菜单实体数据
	 * @return 返回编辑菜单结果
	 */
	@RequiresPermissions("menu:edit")
	@PostMapping("/edit")
	@ResponseBody
	public AjaxResultVo editMenu(@ModelAttribute("menu") SysMenu menu) {
		try {
			int updateResult = menuService.updateSysMenuByMenuId(menu);
			if (updateResult > 0) {
				return AjaxResultVo.success("编辑菜单成功");
			} else {
				return AjaxResultVo.error("编辑菜单失败");
			}
		} catch (Exception e) {
			logger.error(String.format("菜单编辑异常 MenuController.editMenu%s", e));
			return AjaxResultVo.error("编辑菜单失败");
		}
	}

}
